home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 1
/
Cream of the Crop 1.iso
/
PROGRAM
/
PCCP024.ARJ
/
HOST.C
< prev
next >
Wrap
Text File
|
1992-05-17
|
8KB
|
385 lines
/* Copyright (C) 1992 Peter Edward Cann, all rights reserved.
* MicroSoft QuickC
*/
#include<stdio.h>
#include<bios.h>
#include<dos.h>
#include<fcntl.h>
#include<sys\types.h>
#include<sys\stat.h>
#include<signal.h>
#include<process.h>
#include"port.h"
sendchar(c)
unsigned char c;
{
while(!((inp(basereg+STATREG)&TXMTMASK)&&(inp(basereg+MSTATREG)&CTSMASK)))
if(kbhit())
getch();
outp(basereg, c);
}
int follow;
quit()
{
cleanup();
exit(99);
}
sendstr(str)
char *str;
{
int i;
for(i=0;str[i]!='\0';++i)
if(str[i]=='\n')
{
sendchar('\r');
sendchar('\n');
}
else
sendchar(str[i]);
}
portgets(str)
char *str;
{
int i;
i=0;
while(i<256)
{
while(follow==index)
{
if(!(inp(basereg+MSTATREG)&DCDMASK))
return(-1);
if(kbhit())
getch();
}
str[i]=buf[follow++];
if(str[i]=='\b')
if(i>0)
{
i-=2;
sendchar('\b');
sendchar(' ');
sendchar('\b');
}
else
{
i--;
sendchar(0x07);
}
else
sendchar(str[i]);
follow%=TBUFSIZ;
if((str[i]=='\r')||(str[i]=='\n'))
{
sendchar('\r');
sendchar('\n');
str[i]='\0';
break;
}
i++;
}
str[256]='\0';
return(0);
}
pwportgets(str)
char *str;
{
int i;
i=0;
while(i<256)
{
while(follow==index)
{
if(!(inp(basereg+MSTATREG)&DCDMASK))
return(-1);
if(kbhit())
getch();
}
str[i]=buf[follow++];
if(str[i]=='\b')
if(i>0)
{
i-=2;
sendchar('\b');
sendchar(' ');
sendchar('\b');
}
else
{
i--;
sendchar(0x07);
}
else
sendchar('.');
follow%=TBUFSIZ;
if((str[i]=='\r')||(str[i]=='\n'))
{
sendchar('\r');
sendchar('\n');
str[i]='\0';
break;
}
i++;
}
str[256]='\0';
return(0);
}
main(argc, argv)
int argc;
char **argv;
{
long timestamp;
int i, j, outfd, ok, c, run, result;
char str[256];
index=follow=0;
printf("Copyright (C) 1992 Peter Edward Cann, all rights reserved.\n");
if(!strcmp(getenv("REMOTE"), "YES"))
{
printf("You appear to be already logged in remotely, judging by the environment\n");
printf("variable REMOTE, so this is probably a very bad idea.\n");
printf("Are you sure you want to run HOST? (y or n) --> ");
if(getchar()!='y') /* Note getchar() and not getch()! */
{
printf("I didn't think so!\n");
exit(99);
}
else
printf("OK, you're the boss!");
}
if(argc!=4)
{
printf("USAGE: host <comnum> <bps> <password>\n");
exit(1);
}
printf("Control-C to Exit.\n");
comnum=atoi(argv[1])-1;
speed=atoi(argv[2]);
databits='8';
parity='n';
stopbits='1';
setport();
readset();
signal(SIGINT, quit);
outp(basereg+MCTLREG, 0x03); /* Set DTR, RTS, Int. En. */
while(1)
{
printf("Awaiting carrier.\n");
while(!(inp(basereg+MSTATREG)&DCDMASK))
if(kbhit())
getch();
printf("Carrier detected.\n");
setup();
timestamp=time(NULL);
while((time(NULL)-timestamp)<3);
follow=index;
for(i=0;i<3;++i)
{
sprintf(str, "Password? --> ");
sendstr(str);
if(pwportgets(str)==-1)
{
run=0;
break;
}
else if(!strcmp(str, argv[3]))
{
run=1;
break;
}
else
run=0;
}
while(run)
{
follow=index; /* flush input */
sendstr("\n\n DOWNLOAD: (1) Xmodem (2) Xmodem CRC (3) Xmodem CRC 1K\n\n");
sendstr(" UPLOAD: (4) Xmodem (5) Xmodem CRC 1K Optional\n\n");
sendstr(" (s) Shell (q) Quit (^R) Reload HOST\n\n ---> ");
while(index==follow)
{
if(!(inp(basereg+MSTATREG)&DCDMASK))
{
run=0;
break;
}
if(kbhit())
getch();
}
if(!run)
break;
c=buf[follow++];
follow%=TBUFSIZ;
switch(c)
{
case 18:
sendstr("Reload HOST\n");
cleanup();
execlp("host", "host", argv[1], argv[2], argv[3], NULL);
break;
case 'q':
case 'Q':
sendstr("Quit\n");
run=0;
break;
case 's':
case 'S':
sendstr("Shell\n");
printf("Entering command.com remote shell.\n");
sprintf(str, "COM%d", comnum+1);
putenv("PROMPT=REMOTE>$p$g");
putenv("REMOTE=YES");
spawnlp(P_WAIT, "c:\\command.com", "command.com", str, "/e:01024", NULL);
putenv("REMOTE=NO");
setup();
break;
case '1':
sendstr("Xmodem Download.\nSource file pathname? (Blank to cancel)\n --> ");
if((result=portgets(str))==-1)
{
run=0;
break;
}
if(!strlen(str))
break;
result=spawnlp(P_WAIT, "xmodems", "xmodems", argv[1], argv[2], "1", str, NULL);
setup();
sendstr("Press any key to continue: --> ");
while(follow==index)
{
if(!(inp(basereg+MSTATREG)&DCDMASK))
{
run=0;
break;
}
if(kbhit())
getch();
}
follow=index;
sprintf(str, "Exit code = %d.\n", result);
sendstr(str);
break;
case '2':
sendstr("Xmodem CRC Download.\nSource file pathname? (Blank to cancel)\n --> ");
if((result=portgets(str))==-1)
{
run=0;
break;
}
if(!strlen(str))
break;
result=spawnlp(P_WAIT, "xmcrcs", "xmcrcs", argv[1], argv[2], "1", str, NULL);
setup();
sendstr("Press any key to continue: --> ");
while(follow==index)
{
if(!(inp(basereg+MSTATREG)&DCDMASK))
{
run=0;
break;
}
if(kbhit())
getch();
}
follow=index;
sprintf(str, "Exit code = %d.\n", result);
sendstr(str);
break;
case '3':
sendstr("Xmodem CRC 1k Download.\nSource file pathname? (Blank to cancel)\n --> ");
if((result=portgets(str))==-1)
{
run=0;
break;
}
if(!strlen(str))
break;
result=spawnlp(P_WAIT, "xmcrc1ks", "xmcrc1ks", argv[1], argv[2], "1", str, NULL);
setup();
sendstr("Press any key to continue: --> ");
while(follow==index)
{
if(!(inp(basereg+MSTATREG)&DCDMASK))
{
run=0;
break;
}
if(kbhit())
getch();
}
follow=index;
sprintf(str, "Exit code = %d.\n", result);
sendstr(str);
break;
case '4':
sendstr("Xmodem Upload.\nTarget file pathname? (Blank to cancel)\n --> ");
if((result=portgets(str))==-1)
{
run=0;
break;
}
if(!strlen(str))
break;
result=spawnlp(P_WAIT, "xmodemr", "xmodemr", argv[1], argv[2], "1", str, NULL);
setup();
sendstr("Press any key to continue: --> ");
while(follow==index)
{
if(!(inp(basereg+MSTATREG)&DCDMASK))
{
run=0;
break;
}
if(kbhit())
getch();
}
follow=index;
sprintf(str, "Exit code = %d.\n", result);
sendstr(str);
break;
case '5':
sendstr("Xmodem CRC Upload, 1k Optional.\nTarget file pathname? (Blank to cancel)\n --> ");
if((result=portgets(str))==-1)
{
run=0;
break;
}
if(!strlen(str))
break;
result=spawnlp(P_WAIT, "xmcrc1kr", "xmcrc1kr", argv[1], argv[2], "1", str, NULL);
setup();
sendstr("Press any key to continue: --> ");
while(follow==index)
{
if(!(inp(basereg+MSTATREG)&DCDMASK))
{
run=0;
break;
}
if(kbhit())
getch();
}
follow=index;
sprintf(str, "Exit code = %d.\n", result);
sendstr(str);
break;
}
}
printf("Dropping DTR for about 5 seconds.\n");
/* Drop DTR to hang up */
outp(basereg+MCTLREG, 0x08);
timestamp=time(NULL);
while(time(NULL)-timestamp<5)
if(kbhit())
getch();
outp(basereg+MCTLREG, 0x0b);
cleanup();
}
}